package com.travel.common;

import lombok.extern.slf4j.Slf4j;

/**
 * UserContext使用示例
 * 本类仅作为示例，展示如何在服务层或其他组件中使用UserContext
 * 
 * @Author: Jasenon_ce
 * @Date: 2025/03/17/上午10:20
 */
@Slf4j
public class UserContextExample {

    /**
     * 示例方法：获取当前用户ID
     * 在任何需要获取当前用户ID的地方都可以直接使用UserContext.getUserId()
     * 
     * @return 当前用户ID或默认值
     */
    public Long getCurrentUserId() {
        // 从UserContext获取当前用户ID
        Long userId = UserContext.getUserId();
        
        if (userId == null) {
            log.warn("当前上下文中没有用户ID信息");
            return -1L; // 返回默认值或者抛出异常
        }
        
        return userId;
    }
    
    /**
     * 示例方法：根据用户偏好语言处理国际化
     * 
     * @param defaultLanguage 默认语言
     * @return 处理结果信息
     */
    public String processWithUserLanguage(String defaultLanguage) {
        // 从UserContext获取用户偏好语言
        String language = UserContext.getPreferredLanguage();
        
        if (language == null) {
            log.info("用户未设置偏好语言，使用默认语言: {}", defaultLanguage);
            language = defaultLanguage;
        }
        
        // 根据语言处理业务逻辑
        return "使用语言 " + language + " 处理业务";
    }
    
    /**
     * 示例方法：在异步方法中使用UserContext
     * 注意：在多线程环境下，需要手动传递UserContext
     */
    public void asyncProcessExample() {
        // 在启动异步任务前保存当前上下文信息
        final Long userId = UserContext.getUserId();
        final String language = UserContext.getPreferredLanguage();
        final String username = UserContext.getUsername();
        
        // 启动异步任务
        new Thread(() -> {
            try {
                // 在新线程中设置上下文
                UserContext.set(userId, language, username);
                
                // 执行业务逻辑
                log.info("异步任务中的用户ID: {}, 偏好语言: {}", 
                        UserContext.getUserId(), UserContext.getPreferredLanguage());
                
            } finally {
                // 清理上下文，防止内存泄漏
                UserContext.clear();
            }
        }).start();
    }
} 